package com.example.dzl.converter;

import com.example.dzl.dto.ApiStatsDTO;
import com.example.dzl.dto.CancelOrderStatsDTO;
import com.example.dzl.dto.CreateOrderStatsDTO;
import com.example.dzl.dto.EstimatePriceStatsDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers;

/**
 * @author 光的代言人
 */
@Mapper(componentModel = "spring")
public interface ApiStatsConverter {

    /**
     * 将ApiStatsDTO转换为EstimatePriceStatsDTO
     */
    EstimatePriceStatsDTO convertToEstimatePriceStats(ApiStatsDTO apiStatsDTO);

    /**
     * 将ApiStatsDTO转换为CreateOrderStatsDTO
     * 计算成功率：(成功数/请求数)*100，保留整数
     */
    @Mapping(target = "userCount", ignore = true) // 后续补充
    @Mapping(source = ".", target = "successRate", qualifiedByName = "calculateSuccessRate")
    CreateOrderStatsDTO convertToCreateOrderStats(ApiStatsDTO apiStatsDTO);

    /**
     * 将ApiStatsDTO转换为CancelOrderStatsDTO
     * 计算取消占比：成功取消数/总请求数，保留两位小数
     */
    @Mapping(target = "cancelType", ignore = true) // 后续补充
    @Mapping(source = ".", target = "cancelRatio", qualifiedByName = "calculateCancelRatio")
    CancelOrderStatsDTO convertToCancelOrderStats(ApiStatsDTO apiStatsDTO);

    /**
     * 计算成功率：(成功数/请求数)*100，保留整数
     */
    @Named("calculateSuccessRate")
    default Integer calculateSuccessRate(ApiStatsDTO apiStatsDTO) {
        if (apiStatsDTO.getRequestCount() == null || apiStatsDTO.getRequestCount() == 0) {
            return 0;
        }
        if (apiStatsDTO.getSuccessCount() == null) {
            return 0;
        }
        return (int) (((double) apiStatsDTO.getSuccessCount() / apiStatsDTO.getRequestCount()) * 100);
    }

    /**
     * 计算取消占比：成功取消数/总请求数，保留两位小数
     * 这里假设成功取消数对应ApiStatsDTO中的successCount
     * 如果有专门的取消成功数字段，可在此处修改
     */
    @Named("calculateCancelRatio")
    default Double calculateCancelRatio(ApiStatsDTO apiStatsDTO) {
        if (apiStatsDTO.getRequestCount() == null || apiStatsDTO.getRequestCount() == 0) {
            return 0.0;
        }
        // 假设successCount在取消场景中代表成功取消的数量
        if (apiStatsDTO.getSuccessCount() == null) {
            return 0.0;
        }
        // 保留两位小数
        return Math.round(((double) apiStatsDTO.getSuccessCount() / apiStatsDTO.getRequestCount()) * 100.0) / 100.0;
    }
}